#include "lista.h"

#include <stdlib.h>

int ListaJestPusta(Lista const * const pLista) {
  return (pLista->pFirst == NULL);
}

void ListaInicjalizacja(Lista * const pLista) {
  pLista->pFirst = NULL;
  pLista->pLast  = NULL;
}

void ListaDodajOstatniInt(Lista * const pLista, int i, char const * const nazwa) {
  Element *pE;
  pE = malloc( sizeof(Element) );
  TypWartoscUstawNazwa(&pE->tw, nazwa);
  TypWartoscUstawWartoscInt(&pE->tw, i);
  TypWartoscUstawTyp(&pE->tw, 'i');
  pE->pNext = NULL;
  if (pLista->pFirst == NULL) { // jezeli lista byla pusta
    pLista->pFirst = pE;
    pLista->pLast = pE;
  } else { // jezeli juz byl jakis element
    pLista->pLast->pNext = pE;
    pLista->pLast = pE;
  }
}

void ListaDodajOstatniFloat(Lista * const pLista, float f, char const * const nazwa) {
  Element *pE;
  pE = malloc( sizeof(Element) );
  TypWartoscUstawNazwa(&pE->tw, nazwa);
  TypWartoscUstawWartoscFloat(&pE->tw, f);
  TypWartoscUstawTyp(&pE->tw, 'f');
  pE->pNext = NULL;
  if (pLista->pFirst == NULL) { // jezeli lista byla pusta
    pLista->pFirst = pE;
    pLista->pLast = pE;
  } else { // jezeli juz byl jakis element
    pLista->pLast->pNext = pE;
    pLista->pLast = pE;
  }
}

void ListaUsunOstatni(Lista * const pLista) {
  Element *pBeforeLast;
  if (pLista->pFirst == NULL) { // nie mozna usunac gdy pusta
    printf("Nie ma elementu do usuniecia: lista jest pusta\n");
  } else if (pLista->pFirst == pLista->pLast) { // jeden element
    //printf("Ostatni: %x -> %x\n", (unsigned int) pLista->pLast, (unsigned int) pLista->pLast->pNext); 
    free(pLista->pLast);
    pLista->pFirst = NULL;
    pLista->pLast  = NULL;
  }
  else { // więcej niż jeden element
    //printf("Ostatni: %x -> %x\n", (unsigned int) pLista->pLast, (unsigned int) pLista->pLast->pNext);   
    // szukamy przedostatniego elementu
    pBeforeLast = pLista->pFirst;
    //printf("%x -> %x\n", (unsigned int) pBeforeLast, (unsigned int) pBeforeLast->pNext);
    while (pBeforeLast->pNext != pLista->pLast) {
      pBeforeLast = pBeforeLast->pNext;
      //printf("%x -> %x\n", (unsigned int) pBeforeLast, (unsigned int) pBeforeLast->pNext);
    }
    free(pLista->pLast);
    pBeforeLast->pNext = NULL;    
    pLista->pLast = pBeforeLast; // nowy ostatni
  }
}

void ListaUsunWszystkie(Lista * const pLista) {
  while(!ListaJestPusta(pLista)) {
    ListaUsunOstatni(pLista);
  }
}

void ListaDrukuj(Lista const * const pLista) {
  Element *pE;
  pE = pLista->pFirst;
  while (pE != NULL) {
    TypWartoscDrukuj(&pE->tw);
    printf(" ");
    pE = pE->pNext;
  }
  printf("\n");
}